package com.pipline3;

/**
 * @author ycd0075
 * @date 2023-07-11 14:36
 */
public class DefaultPipline implements Pipeline{
    private HandlerNode head = new HandlerNode();//链表的头结点

    private HandlerNode tail = head;//链表的尾结点，一定要赋值，不让空指针异常，tail=null

    private MyContext context;

    public void start() {//启动所有功能部件（handler）
        // 启动第一个执行的功能部件，里面就会自动执行完整的流水线过程
        head.getNext().exec(context);
    }

    public MyContext getContext() {
        return context;
    }

    public DefaultPipline(MyContext context) {
        this.context = context;
    }

    /**
     * 添加多个新的结点（hander）到链首（带头结点的链表）
     * @param handlers
     */
    public void addHead(Handler... handlers) {
        //后加的新结点靠近头部，是流水线里先执行的部分
        // (handler1, handler2,handler3)
        HandlerNode next = head.getNext();

        for (Handler handler : handlers) {

            HandlerNode handlerNode = new HandlerNode();
            handlerNode.setHandler(handler);


            handlerNode.setNext(next);
            next = handlerNode;

        }
        head.setNext(next);


    }

    /**
     * 添加handler到尾部
     * @param handlers
     */
    public void addTail(Handler... handlers) {

        HandlerNode node = tail;

        for (Handler handler : handlers) {

            HandlerNode handlerNode = new HandlerNode();
            handlerNode.setHandler(handler);

            node.setNext(handlerNode);
            node = handlerNode;
        }

        tail = node;

    }
}
